package org.bilinc.gz001.dao;


import org.apache.commons.lang.StringUtils;
import org.bilinc.gz001.Utils;
import org.bilinc.gz001.dao.interfaces.AbstractDaoImpl;
import org.bilinc.gz001.dao.recover.RecoverCalendar;
import org.bilinc.gz001.entity.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
public class WorkingDataDao extends AbstractDaoImpl<Resource> {

    @Autowired
    MonthDao monthDao;

    @Autowired
    RecoverCalendar recoverCalendar;

    /*МАССИВ ДАННЫХ ЗА ГОД ПО ЧЕЛУ*/
    private final static String HQL_GET_YEAR_WORKING_DATA_BY_RESOURCE = "SELECT mon.data FROM Month mon WHERE mon.resource=:resourceId order by mon.monthNumber asc";

    /*МАССИВ ДАННЫХ ЗА ГОД ПО ЧЕЛУ*/
    public List<String> getYearWorkingDataByResource(Resource resource) {
        List<String> data = new ArrayList<String>();
        data =  getSession().createQuery(HQL_GET_YEAR_WORKING_DATA_BY_RESOURCE)
                .setLong("resourceId", resource.getId())
                .list();
        if (data == null) {
            System.out.println("У " +  resource.getFullName() + " Календаря нет совсем!");
            monthDao.addCalendarForResource(resource);
            data =  getSession().createQuery(HQL_GET_YEAR_WORKING_DATA_BY_RESOURCE)
                    .setLong("resourceId", resource.getId())
                    .list();
        }
        if (data.size() != 12) {
            System.out.println("У " + resource.getFullName() + " Месяцев не столько, сколько нужно!");
            System.out.println("Их " + data.size() + "!");
            recoverCalendar.createMissedMonthsForResourceEmergencyUse(2013, resource);
            data =  getSession().createQuery(HQL_GET_YEAR_WORKING_DATA_BY_RESOURCE)
                    .setLong("resourceId", resource.getId())
                    .list();
        }

        List<String> outputRow = new ArrayList<String>();
        String pattern = ";";
        char pat = ';';
        int month = 0;
        for (String monthData : data) {
            List<String> daysOfMonth = Utils.split(monthData, pattern);

            boolean isCorruptedMonth = false;
            if (daysOfMonth.size() == 0) {
                isCorruptedMonth = true;
            } else {
                if (daysOfMonth.size() != Utils.DAYS_PER_MONTH[month]) {
                    isCorruptedMonth = true;
                }
            }

            if (isCorruptedMonth) {
                System.out.println("Дней в месяце не столько, сколько нужно!");
                System.out.println("Должно быть " + Utils.DAYS_PER_MONTH[month] + " а их " + daysOfMonth.size());
                recoverCalendar.emergencyRecoverCalendarFromCorrupted(2013, month, 1, resource.getTabNumber());
                System.out.println("Вроде восстановились, попробуем взять данные по " + resource.getFullName() + " Еще раз");
                return getYearWorkingDataByResource(resource);
            }

            outputRow.addAll(daysOfMonth);
            month++;
        }
        closeSession();
        return outputRow;
    }

    WorkingDataDao() {
    }

}
